// 需求：实现一个输入url数组与并发数的并发数量控制请求队列函数

/*
    核心思路：控制并发数量，关键点就是利用promise,当一个请求完成后,去发起下一个请求
    思路：
        1. 要完成一个继续一个，保证同时有limit个在同时执行，所以我们需要一个递归的执行函数run
        2. 首先在函数执行时，需要将执行中的任务按顺序填满，数量为限制并发数
        3. 执行函数中，需要在执行完成后，判断是否有下一个待执行任务：
            声明变量i来计数，与最终需要执行的总数比较判断是否需要递归执行下一个任务
*/



const fn = url => {
    // 实际场景这里用axios等请求库 发请求即可 也不用设置延时
    return new Promise(resolve => {
        console.log('完成一个任务 ', url, new Date());
        resolve({
            url,
            date:new Date(),
        })
    });
};


function limitQueue(urls, limit) {
    // 完成任务数
    let i = 0;
    // 填充满执行队列
    for (let excuteCount = 0; excuteCount < limit; excuteCount++) {
        run();
    };

    // 执行任务
    function run() {
        // 构造待执行任务 当该任务完成后 如果还有待完成的任务 继续执行任务
        new Promise((resolve, reject) => {
            let url = urls[i++];
            resolve(fn(url));
        }).then(() => {
            if (i < urls.length) run();
        })
    };
};


// test
const urls = [1,2,3,4,5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];

(async _ => {
    await limitQueue(urls, 4);
})();